#include "power_board_pkg/m_utility_fun.h"

/*函数作用：字符串转16进制
* 参数：char *pbDest->16进制存储区
*       const char *pbSrc->字符串存储区
*       const int nLen->字符串长度
*/
void StrToHex(char *pbDest, const char *pbSrc,const int nLen)
{
    char h1,h2;
    char s1,s2;
    int i;
    // for(i=0; i<nLen; i++)
    // {
    //     h1 = pbSrc[i];       
    //     s1 = toupper(h1) - 0x30; //toupper 转换为大写字母
    //     if (s1 > 9)
    //         s1 -= 7;
    //     pbDest[i] = s1*16;
    // }
    for (i=0; i<nLen/2; i++)
    {
        h1 = pbSrc[2*i];
        h2 = pbSrc[2*i+1];

        s1 = toupper(h1) - 0x30; //toupper 转换为大写字母
        if (s1 > 9)
            s1 -= 7;
        s2 = toupper(h2) - 0x30;
        if (s2 > 9)
            s2 -= 7;

        pbDest[i] = s1*16 + s2;
    }
}

/*函数作用：16进制转字符串
* 参数：char *pbDest->16进制存储区
*       const char *pbSrc->字符串存储区
*       const int nLen->字符串长度
*/
void HexToStr(char *pbDest,const char *pbSrc,const int nLen)
{
    char ddl,ddh;
    for (int i = 0; i < nLen; i++)
    {
        ddh = 48 + pbSrc[i] / 16;
        ddl = 48 + pbSrc[i] % 16;
        if (ddh > 57) ddh = ddh + 7;
        if (ddl > 57) ddl = ddl + 7;
        pbDest[i * 2] = ddh;
        pbDest[i * 2 + 1] = ddl;
    }
    pbDest[nLen * 2] = '\0';
}


/*函数作用：字符串转10进制，支持负数转换
* 参数：const char *str->需要转换的字符串
* 返回值：int->10进制
*/
int my_atoi(const char *str)
{
    int value = 0;
    int flag = 1; //判断符号
    while (*str == ' ')  //跳过字符串前面的空格
    {
        str++;
    }
    if (*str == '-')  //第一个字符若是‘-’，说明可能是负数
    {
        flag = 0;
        str++;
    }
    else if (*str == '+') //第一个字符若是‘+’，说明可能是正数
    {
        flag = 1;
        str++;
    }//第一个字符若不是‘+’‘-’也不是数字字符，直接返回0
    else if (*str >= '9' || *str <= '0') 
    {
        return 0;    
    }
    //当遇到非数字字符或遇到‘\0’时，结束转化
    while (*str != '\0' && *str <= '9' && *str >= '0')
    {
        value = value * 10 + *str - '0'; //将数字字符转为对应的整形数
        str++;
    }
    if (flag == 0) //负数的情况
    {
        value = -value;
    }
    return value;
}

/*函数作用：字符串转10进制，正数转换
* 参数：char *pszDest->10进制存储区
*       const char *pbSrc->字符串存储区
*       const int nLen->字符串长度
*/
void StrtoDec(unsigned int *pbDest,const char *pbSrc,const int nLen)
{
    int i;
    int tmp=0;
    if(nLen > 10)
        *pbDest = 0;
    tmp = 1;
    *pbDest = 0;
    for (i=nLen-1; i>=0; i--)
    {
        *pbDest += tmp*(*(pbSrc+i)-'0');
        tmp = tmp*10;
    }
}

/*函数作用：10进制转字符串
* 参数：char *pbDest->10进制存储区
*       const char *pbSrc->字符串存储区
*       const int nLen->字符串长度
*/
int DectoStr(char *pbDest,const char *pbSrc,const int nLen)
{
    int i=0;

    for(i=0;i<nLen;i++)
    {
        sprintf((char *)(pbDest + i * 2), "%02d", *(pbSrc + i));
    }
    *(pbDest + i * 2) = '\0';
    return  (i * 2);
}

//m^n函数
//返回值:m^n次方.
static unsigned int NMEA_Pow(unsigned char m,unsigned char n)
{
    unsigned int result=1;
    while(n--)
        result *= m;
    return result;
}

/*函数说明：字符串转浮点型，str转换为数字,以','或者'*'结束
* 参数：unsigned char* buf->数字存储区
*       unsigned char* dx->小数点位数,返回给调用函数
* 返回值:int->转换后的数值
*/
int StrToFloat(unsigned char* buf,unsigned char* dx)
{
    unsigned char *p=buf;
    unsigned int ires=0,fres=0;
    unsigned char ilen=0,flen=0,i;
    unsigned char mask=0;
    int res;
    while(1) //得到整数和小数的长度
    {
        if(*p=='-')
        {
            mask|=0X02;
            p++;
        }//是负数
        if(*p==','||(*p=='*'))
            break;//遇到结束了
        if(*p=='.')
        {
            mask|=0X01;
            p++;
        }//遇到小数点了
        else if(*p>'9'||(*p<'0'))   //有非法字符
        {   
            ilen=0;
            flen=0;
            break;
        }   
        if(mask&0X01)
            flen++;
        else 
            ilen++;
        p++;
    }
    if(mask&0X02)
        buf++; //去掉负号
    for(i=0;i<ilen;i++) //得到整数部分数据
    {  
        ires+=NMEA_Pow(10,ilen-1-i)*(buf[i]-'0');
    }
    if(flen>5)
        flen=5;   //最多取5位小数
    *dx=flen;           //小数点位数
    for(i=0;i<flen;i++) //得到小数部分数据
    {  
        fres+=NMEA_Pow(10,flen-1-i)*(buf[ilen+1+i]-'0');
    } 
    res=ires*NMEA_Pow(10,flen)+fres;
    if(mask&0X02)
        res=-res;         
    return res;
} 




